;A  - Length of	input line
;D  - YCOOR
;E  - XCOOR
;HL - Address of bufer input

INPUT64
	LD	(LENGTH_LINE),A
	LD	(AT_X),DE
	LD	(BEGIN_AT),DE
	LD	(BUFER_INPUT),HL
	LD	(BEGIN_BUF_INP),HL

	PUSH	DE
	LD	DE,BUF_COPY_NAME
	PUSH	HL
	LD	C,A
	XOR	A
	LD	(CURRENT_LENGTH),A
	LD	B,A
	LDIR
	LD	A,0
	LD	(DE),A
	POP	HL
	CALL	PRINT64
	POP	DE
	LD	(AT_X),DE
	CALL	CURSOR_ON_OFF

SCAN_KEYBOARD
	EI
	XOR	A
	LD	(23560),A
SCAN_KEYBOARD2
	LD	A,(23560)
	OR	A
	JR	Z,SCAN_KEYBOARD2

	CALL	BEEP

	CP	#20
	JR	NC,CHAR?

	CP	7
	JR	NZ,NO_RET_NAME
	CALL	RETURN_NAME
	CALL	CURSOR_ON_OFF
	JR	SCAN_KEYBOARD

NO_RET_NAME
	CP	8
	JR	Z,CTRL_LEFT

	CP	9
	JP	Z,CTRL_RIGHT

	CP	10
	JP	Z,CTRL_BEGIN

	CP	11
	JP	Z,CTRL_END

	CP	12
	JP	Z,CTRL_DELETE

	CP	13
	JR	NZ,NO_ENTER
	CALL	CURSOR_ON_OFF
	RET

NO_ENTER
	CP	14
	JR	NZ,NO_RUS_LAT
	LD	HL,RUS_LAT
	BIT	7,(HL)
	JR	NZ,RUS
LAT
	SET	7,(HL)
	JR	SCAN_KEYBOARD
RUS
	RES	7,(HL)
	JR	SCAN_KEYBOARD

NO_RUS_LAT
	CP	15
	JP	Z,CTRL_INSERT
JR_SCAN_KEYB
	JR	SCAN_KEYBOARD

CHAR?
	CP	#80
	JR	NC,SCAN_KEYBOARD

SKIP_VERIFI
	LD	B,A
	LD	A,(RUS_LAT)
	ADD	A,B
	LD	B,A

	CALL	END_LINE?
	JR	NC,SCAN_KEYBOARD
	INC	A
	LD	(CURRENT_LENGTH),A

	LD	A,B
	LD	HL,(BUFER_INPUT)
	LD	(HL),A
	INC	HL
	LD	(BUFER_INPUT),HL

	CALL	CURSOR_ON_OFF
	CALL	PRINT_CHAR64
	CALL	CURSOR_ON_OFF

	JR	JR_SCAN_KEYB
;
CTRL_LEFT
	LD	A,(CURRENT_LENGTH)
	OR	A
	JR	Z,JR_SCAN_KEYB
	CALL	CURSOR_ON_OFF
	CALL	PREC_POSITION
DEC_PARAMETRS
	LD	HL,CURRENT_LENGTH
	DEC	(HL)
	LD	HL,(BUFER_INPUT)
	DEC	HL
END_LEFT_RIGHT
	LD	(BUFER_INPUT),HL
	CALL	CURSOR_ON_OFF
JR_SCAN_KEYB1
	JR	JR_SCAN_KEYB
;
CTRL_RIGHT
	CALL	END_LINE?
	JR	Z,JR_SCAN_KEYB
	CALL	CURSOR_ON_OFF
	LD	DE,(AT_X)
	INC	E
	LD	(AT_X),DE
	LD	HL,CURRENT_LENGTH
	INC	(HL)
	LD	HL,(BUFER_INPUT)
	INC	HL
	JR	END_LEFT_RIGHT
;
CTRL_BEGIN
	CALL	CURSOR_ON_OFF
	XOR	A
	LD	(CURRENT_LENGTH),A
	CALL	INIT_AT
	LD	HL,(BEGIN_BUF_INP)
	JR	END_LEFT_RIGHT
;
CTRL_END
	CALL	CURSOR_ON_OFF
	LD	A,(LENGTH_LINE)
	LD	(CURRENT_LENGTH),A
	LD	C,A
	LD	B,0
	LD	HL,(BEGIN_AT)
	ADD	HL,BC
	LD	(AT_X),HL
	LD	HL,(BEGIN_BUF_INP)
	ADD	HL,BC
	JR	END_LEFT_RIGHT
;
CTRL_DELETE
	LD	A,(CURRENT_LENGTH)
	OR	A
	JR	Z,JR_SCAN_KEYB1

	CALL	LEN_RIGHT_PART
	LD	HL,(BUFER_INPUT)
	JR	Z,SKIP_LDIR
	LD	C,A
	LD	B,0
	PUSH	HL
	POP	DE
	DEC	DE
	LDIR
SKIP_LDIR
	DEC	HL
	LD	(HL),32

	CALL	CURSOR_ON_OFF
	CALL	PREC_POSITION
	PUSH	DE
	CALL	INIT_AT
	LD	HL,(BEGIN_BUF_INP)
	CALL	PRINT64
	POP	DE
	LD	(AT_X),DE
	JP	DEC_PARAMETRS
;
CTRL_INSERT
	CALL	END_LINE?
	JR	Z,JR_SCAN_KEYB1

	CALL	LEN_RIGHT_PART
	DEC	A
	LD	HL,(BUFER_INPUT)
	JR	Z,SKIP_LDDR
	PUSH	HL
	LD	C,A
	LD	B,0
	ADD	HL,BC
	PUSH	HL
	POP	DE
	DEC	HL
	LDDR
	POP	HL
SKIP_LDDR
	LD	(HL),32
	LD	DE,(AT_X)
	CALL	PRINT64
	LD	(AT_X),DE
	CALL	CURSOR_ON_OFF
	JP	SCAN_KEYBOARD
;
RETURN_NAME
	LD	DE,(BEGIN_BUF_INP)
	PUSH	DE
	LD	HL,BUF_COPY_NAME
	LD	BC,(LENGTH_LINE)
	LD	B,0
	LDIR
	POP	HL
	LD	DE,(AT_X)
	PUSH	DE
	CALL	INIT_AT
	CALL	PRINT64
	POP	DE
	JR	END_NEW_POS
;
INIT_AT
	LD	DE,(BEGIN_AT)
	JR	END_NEW_POS
;
LEN_RIGHT_PART
	LD	A,(LENGTH_LINE)
	LD	BC,(CURRENT_LENGTH-1)
	SUB	B
	RET
;
PREC_POSITION
	LD	DE,(AT_X)
	DEC	E
END_NEW_POS
	LD	(AT_X),DE
	RET
;
END_LINE?
	LD	A,(CURRENT_LENGTH)
	LD	HL,LENGTH_LINE
	CP	(HL)
	RET
;
BEEP
	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL
	PUSH	IX
	LD	HL,#000A
	LD	DE,#0032
	CALL	#03B5
	POP	IX
	POP	HL
	POP	DE
	POP	BC
	POP	AF
	RET

;HL - address of text
;CTRL: #16 - AT
;      #11 - PAPER
;      #10 - INK
;      0   - end of text

PRINT64
	LD	A,(HL)
	OR	A
	RET	Z

	INC	HL

	CP	#16
	JR	Z,AT_CTRL

	CP	#11
	JR	Z,PAPER_CTRL

	CP	#10
	JR	Z,INK_CTRL

	PUSH	HL
	PUSH	AF
	LD	A,(AT_X)
	RRA
	LD	B,0
	LD	C,A
	LD	H,B
	LD	A,(AT_Y)
	LD	L,A
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,BC
	LD	BC,#5800
	ADD	HL,BC
	LD	A,(ATTR)
	LD	(HL),A
	POP	AF

	CALL	PRINT_CHAR64

	POP	HL
	JR	PRINT64
;
AT_CTRL
	LD	D,(HL)
	INC	HL
	LD	E,(HL)
	INC	HL
	LD	(AT_X),DE
	JR	PRINT64
;
PAPER_CTRL
	LD	A,(ATTR)
	AND	7
	LD	B,A
	LD	A,(HL)
	RLCA
	RLCA
	RLCA
	JR	PAPER_PLUS_INK
;
INK_CTRL
	LD	A,(ATTR)
	AND	#38
	LD	B,A
	LD	A,(HL)

PAPER_PLUS_INK
	OR	B
	LD	(ATTR),A
	INC	HL
	JR	PRINT64

;A - code of char
PRINT_CHAR64
	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL
	CALL	PRINT_CHAR
	LD	HL,AT_X
	INC	(HL)
	BIT	6,(HL)
	JR	Z,NO_NEXT_AT_Y
	LD	(HL),0
	INC	HL
	INC	(HL)
NO_NEXT_AT_Y
	POP	HL
	POP	DE
	POP	BC
	POP	AF
	RET
;
PRINT_CHAR
	SRL	A
	PUSH	AF
	LD	H,#00
	LD	L,A
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	DE,FONT
	ADD	HL,DE
	EX	DE,HL
	CALL	ADDR_OF_OUT64
	LD	B,#08
	JR	C,PRINT_IN_RIGHT
	POP	AF
	JR	NC,WITH_RIGHT
PRINT_IN_LEFT
WITH_LEFT
	LD	A,(HL)
	AND	#0F
	LD	C,A
	LD	A,(DE)
	AND	#0F
	RLC	A
	RLC	A
	RLC	A
	RLC	A
	OR	C
	LD	(HL),A
	INC	DE
	INC	H
	DJNZ	WITH_LEFT
	RET
WITH_RIGHT
	LD	A,(HL)
	AND	#0F
	LD	C,A
	LD	A,(DE)
	AND	#F0
	OR	C
	LD	(HL),A
	INC	DE
	INC	H
	DJNZ	WITH_RIGHT
	RET
PRINT_IN_RIGHT
	POP	AF
	JR	NC,WITH_RIGHT2
WITH_LEFT2
	LD	A,(HL)
	AND	#F0
	LD	C,A
	LD	A,(DE)
	AND	#0F
	OR	C
	LD	(HL),A
	INC	DE
	INC	H
	DJNZ	WITH_LEFT2
	RET
WITH_RIGHT2
	LD	A,(HL)
	AND	#F0
	LD	C,A
	LD	A,(DE)
	AND	#F0
	RLC	A
	RLC	A
	RLC	A
	RLC	A
	OR	C
	LD	(HL),A
	INC	DE
	INC	H
	DJNZ	WITH_RIGHT2
	RET
;
CURSOR_ON_OFF
	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL
	CALL	ADDR_OF_OUT64
	LD	A,#F0
	JR	NC,PRINT_IN_LEFT2
	LD	A,#0F
PRINT_IN_LEFT2
	LD	C,A
	LD	B,8
NEXT_BYTE
	LD	A,(HL)
	XOR	C
	LD	(HL),A
	INC	H
	DJNZ	NEXT_BYTE
	POP	HL
	POP	DE
	POP	BC
	POP	AF
	RET
;
ADDR_OF_OUT64
	LD	A,(AT_Y)
	LD	H,#00
	LD	L,A
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	A,(AT_X)
	RRA
	PUSH	AF
	LD	B,#00
	LD	C,A
	ADD	HL,BC
	RL	H
	RL	H
	RL	H
	SET	6,H
	POP	AF
	RET
;
LENGTH_LINE
	DEFB	0
BEGIN_AT
	DEFB	0,0
BUFER_INPUT
	DEFW	0
BEGIN_BUF_INP
	DEFW	0
CURRENT_LENGTH
	DEFB	0
RUS_LAT
	DEFB	0
BUF_COPY_NAME
	DEFS	9
AT_X	DEFB	0
AT_Y	DEFB	0
ATTR	DEFB	56
CURSOR_Y
	DEFB	0
CURSOR_X
	DEFB	1

